package com.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * @Todo: jwt工具类
 **/
public class JWTUtils {
    //    默认的过期时间 50分钟
    public static final long EXPERING_TIME = 50*60*1000L;
    /**
     * 用来生成token字符串！
     * @param username 用来存入Claim自定义属性中 密码切记不要放进去，因为jwt中间的body，是明文
     * @return java.lang.String
     */
    public static String sign(String username,String password){
        Algorithm algorithm = Algorithm.HMAC256(password);
        //配置一个过期时间
        Date expering_time = new Date(System.currentTimeMillis() + EXPERING_TIME);
        String token = JWT.create().withClaim("username", username)
                .withSubject(username)
                //过期时间
                .withExpiresAt(expering_time)
                .sign(algorithm);
        return token;
    }
    /**
     * 校验你的token是否正确
     * @param token 前端传过来的token传
     * @param username 加密的时候用的用户名
     * @param password 加密的时候用的签名
     * @return boolean
     */
    public static boolean verify(String token,String username,String password){
        Algorithm algorithm = Algorithm.HMAC256(password);
        //重新计算加密比较来进行校验两个Token是否一样
        JWTVerifier jwtVerifier = JWT.require(algorithm)
                .withClaim("username",username)
                .withSubject(username).build();
        jwtVerifier.verify(token);
        return true;
    }
    /**
     * 从token中取出claim自定义属性 获取username
     * @param token
     * @return java.lang.String 用户名
     */
    public static String getUsername(String token){
        DecodedJWT decode = JWT.decode(token);
        //还可以选择使用这个来获取用户名
        return decode.getSubject();
    }
}